﻿#pragma once

#include "MathOperation.h"

namespace ASL
{
    // 质量组件模型
    class ASL_API Component
    {
    public:
        // 构造函数
        Component();

        // 析构函数
        ~Component();

        // 重心偏移计算函数
        static ASL::Vector deltaCG(double ratio, ASL::Vector &location);

        // 附加转动惯量计算函数
        static ASL::Matrix extraInertia(double mass, ASL::Vector &location, ASL::Vector &CG);

    public:
        // 组件质量 kg
        double mass;

        // 组件安装位置 m 结构系 [X, Y, Z]
        ASL::Vector location;

        // 组件重心位置 m 结构系 [X, Y, Z]
        ASL::Vector CG;

        // 组件转动惯量 kg*m^2 机体系 [3x3]
        ASL::Matrix inertia;
    };

    // 通用质量特性模型
    class ASL_API MassProperty
    {
    public:
        // 构造函数
        MassProperty();

        // 析构函数
        ~MassProperty();

        // 参数配置函数
        // 输入 aircraft 飞行器类型 AIRCRAFT_XXX
        // 返回 return 执行状态 -
        bool setup(int aircraft);

        // 初始化函数
        // 输入 -
        // 返回 return 执行状态 -
        bool initialize(void);

        // 单步运行函数
        // 输入 -
        // 返回 return 执行状态 -
        bool step(void);

    public:
        // 输入端口列表
        struct Input
        {
            // 燃料消耗量 kg
            double fuelExpendedL;
            double fuelExpendedR;
            double fuelExpendedC;
        };

        // 输出端口列表
        struct Output
        {
            // 综合质量 kg
            double mass;

            // 综合重心位置 m 结构系 [X, Y, Z]
            ASL::Vector CG;

            // 综合转动惯量 kg*m^2 机体系 [3x3]
            ASL::Matrix inertia;
        };

        // 参数端口列表
        struct Parameter
        {
            // 基础结构对象
            ASL::Component base;

            // 飞行员对象
            ASL::Component pilot;

            // 燃料箱对象
            ASL::Component tankL;
            ASL::Component tankR;
            ASL::Component tankC;
        };

    public:
        // 输入端口对象
        MassProperty::Input input;

        // 输入端口对象
        MassProperty::Output output;

        // 参数端口对象
        MassProperty::Parameter parameter;

    private:
    };

}